package com.sumset.backbeans;

import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.swing.ImageIcon;
import com.sumset.daos.DaoCiudad;
import com.sumset.daos.DaoRango;
import com.sumset.daos.DaoUsuario;
import com.sumset.entidades.Ciudad;
import com.sumset.entidades.Rango;
import com.sumset.entidades.Usuario;
import com.sumset.variablesglobales.VariablesGLobales;

/**
 * Descripcion Clase: Clase donde se alojaran todas las funciones representativas de las paginas de los usuarios.
 * Responsabilidades: Atender y procesar todas las solicitudes de las paginas relacionadas con los usuarios.
 * Fecha Creacion: 13/02/2012
 * @author andres.
 * @author deivid.
 */
@SessionScoped
@ManagedBean
public class UsuarioBean {

	@EJB
	private DaoUsuario ejbUsuario;
	@EJB
	private DaoCiudad ejbCiudad;
	@EJB
	private DaoRango ejbRango;

	private String nombre;
	private String nickUser;
	private String email;
	private String password;
	private Date fechaNacimiento;
	private byte avatar[];
	private Integer numeroCiudad;
	private Usuario usuario;
	private String numeroSexo;
	
	private static final String USUARIO_ADMON = "admon";
	private static final String USUARIO_ATANCION_LLAMADAS = "atencionLlamadas";
	private static final String USUARIO_USER = "usuarios";
	private static final Integer CODIGO_USUARIO = 3;

	/**
	 * Proposito del Metodo: Registrar usuarios al taringa.
	 * Responsabilidades: Es responsable De obtener los cambios que se realizan sobre los campos
	 * necesarios de los usuarios, para luego registrarlos.
	 * @return ruta: la ruta de la pagina a redireccionar
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No tiene
	 * @exception No tiene*/
	public String registrarUsuario() throws Exception {

		try {
			
			Usuario usuario = new Usuario();
			validarEntradasLetras(nombre);
			usuario.setNombre(nombre);
			usuario.setNickUser(nickUser);
			usuario.setAvatar(null);
			usuario.setFechaNacimiento(fechaNacimiento);
			usuario.setPassword(password);
			usuario.setSexo(numeroSexo);
			usuario.setCorreo(email);
			usuario.setComunidad(null);
			Ciudad ciudad = ejbCiudad.buscar(numeroCiudad);
			usuario.setCiudad(ciudad);
			Rango rango = ejbRango.buscar(CODIGO_USUARIO);
			usuario.setRango(rango);

			ejbUsuario.insertar(usuario);
			
		} catch (Exception e) {
			
			irPaginaLogin();
		}

		return VariablesGLobales.RUTA_LOGIN;
	}
	
	
	
	/**
	 * Proposito del Metodo:Redireccionar a otra pagina.
	 * Responsabilidades: Es responsable de redireccionar a la pagina de 
	 * error del sistema
	 * @return la pagina redireccionada
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No tiene
	 * @exception No tiene*/
	public String irPaginaError() {
		
		return VariablesGLobales.RUTA_PAGINA_ERROR;
		
	}
	
	

	
	/**
	 * Proposito del Metodo:Redireccionar a otra pagina.
	 * Responsabilidades: Es responsable de redireccionar a la pagina de 
	 * de iniciar sesion del usuario.
	 * @return la pagina redireccionada
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No tiene
	 * @exception No tiene*/
	public String irPaginaLogin() {
		
		return VariablesGLobales.RUTA_LOGIN;
		
	}
	

	
	/**
	 * Proposito del Metodo:validacion de texto.
	 * Responsabilidades: Es responsable de validar los caracteres que
	 * tengan los campos de entrada
	 * @return verdadero si los campos son correctos, falso si
	 * algun campo es violado
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No tiene
	 * @exception No tiene*/
	public boolean validarEntradasLetras(String entrada) {
		
		boolean correcto = false;
        boolean algunDigito = false; 
        boolean algunaLetra = false; 
        for (int i = 0; i < entrada.length(); i++) { 
            if (Character.isLetter(entrada.charAt(i))) { 
                //es un digito 
                algunaLetra = true; 
            } else { 
                algunDigito = true; 
                //no es un digito 
            } 
        } 
        if(algunaLetra && !algunDigito){ 
            
        	correcto = true;
        	
        	return correcto;

        } 
        else {
        	
        	irPaginaError();	
            return false;
        	
        }
			
        	
		
	}


	/**
	 * Proposito del Metodo:iniciar sesion.
	 * Responsabilidades: validar los datos del usuario, y si el usuario si existe,
	 * entrar a la pagina de las actividades del taringa
	 * @return la pagina redireccionada
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No tiene
	 * @exception No tiene*/
	public String loginUsuario() {

		try {
			
			usuario = ejbUsuario.buscar(nickUser);
			if (usuario.getPassword().equals(password)
					&& usuario.getNickUser().equals(nickUser)) {
				
				if(usuario.getRango().getDescripcion().equals(USUARIO_ADMON)) {
					
					
					return VariablesGLobales.RUTA_PAGINA_RECEPCION_LLAMADAS;
					
				}
				
				if(usuario.getRango().getDescripcion().equals(USUARIO_ATANCION_LLAMADAS)) {
					
					return VariablesGLobales.RUTA_PAGINA_MIS_LLAMADITAS;
					
				}
				

				if(usuario.getRango().getDescripcion().equals(USUARIO_USER)) {
					
					return VariablesGLobales.RUTA_OPERACIONES_USARIO;
					
				}
					
				
				
			}

			
		} catch (Exception e) {
			
			return irPaginaLogin();
		}
		
		return null;
		

	}

	
	/**
	 * Proposito del Metodo:listar ciudades.
	 * Responsabilidades: Es responsable de listar todas las ciudades para
	 * asignarlas en un combobox.
	 * @return lista de elementos que seran las ciudades a mostrar
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No tiene
	 * @exception No tiene*/
	public List<SelectItem> getListarCiudades() {

		List<SelectItem> listaItems = new ArrayList<SelectItem>();
		
		try {
			
			List<Ciudad> listaCiudad = ejbCiudad.listarDatos();
			for (Ciudad ciudad : listaCiudad) {

				SelectItem item = new SelectItem(ciudad.getId(), ciudad.getNombre());
				listaItems.add(item);
			}
			
		} catch (Exception e) {
			
			irPaginaError();
		}

		return listaItems;

	}


	
	/**
	 * Proposito del Metodo:cerrar sesion.
	 * Responsabilidades: Es responsable de cerrar las sesion
	 * cuando el usuario se salga del sistema.
	 * @return la pagina redireccionada
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No tiene
	 * @exception No tiene*/
	public String cerrarSesion() {

		FacesContext context = FacesContext.getCurrentInstance();
		context.getExternalContext().getSessionMap().clear();

		return VariablesGLobales.RUTA_LOGIN;

	}

	
	/**
	 * Proposito del Metodo:cargar una imagen.
	 * Responsabilidades: Es responsable de cargar una imagen
	 * seleccionada de su equipo
	 * @return No aplica
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param g2d
	 * @param data
	 * @exception No tiene*/
	public void cargarFotoUsuarioSesion(Graphics2D g2d, Object data) {

		String nick = (String) data;
		Usuario us = ejbUsuario.buscar(nick);
		ImageIcon im = new ImageIcon(us.getAvatar());
		g2d.drawImage(im.getImage(), 0, 0, 100, 100, null);

	}


	
	/**
	 * Proposito del Metodo:listar los sexos.
	 * Responsabilidades: Es responsable de listar todas los sexos para
	 * asignarlos en un combobox.
	 * @return lista de elementos que seran las ciudades a mostrar
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No tiene
	 * @exception No tiene*/
	public List<SelectItem> getListarSexo() {

		List<SelectItem> listaItems = new ArrayList<SelectItem>();
		
		try {
			
			SelectItem item1 = new SelectItem("Masculino", "Masculino");
			SelectItem item2 = new SelectItem("Femenino", "Femenino");
			listaItems.add(item1);
			listaItems.add(item2);

			
		} catch (Exception e) {
			
			irPaginaError();
		}
		
		return listaItems;

	}


	/**
	 * Proposito del Metodo:actualizar usuarios.
	 * Responsabilidades: Es responsable de actualizar los datos basicos 
	 * de un usuario ya registrado.
	 * @return pagina redireccionada.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No tiene
	 * @exception No tiene*/
	public String actualizarUsuario() throws Exception {

		usuario.setSexo(numeroSexo);
		validarEntradasLetras(usuario.getNombre());
		Ciudad ciudad = ejbCiudad.buscar(numeroCiudad);
		usuario.setCiudad(ciudad);
		ejbUsuario.actualizar(usuario);
		return VariablesGLobales.RUTA_OPERACIONES_USARIO;

	}

	//Asignacion y obtencion de variables.
	/**
	 * Metodo para obtener el valor del nombre en la pagina
	 * 
	 * @return el valor del nombre
	 */
	public String getNombre() {
		return nombre;
	}

	/**
	 * Metodo para agregar un valor al nombre del usuario
	 * 
	 * @param nombre
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	/**
	 * Metodo para obtener el valor del nick del usuario
	 * 
	 * @return el nick del usuario
	 */
	public String getNickUser() {
		return nickUser;
	}

	/**
	 * Metodo para Agregar un valor al nick del usuario
	 * 
	 * @param nickUser
	 */
	public void setNickUser(String nickUser) {
		this.nickUser = nickUser;
	}

	/**
	 * Metodo para obtener el valor del email
	 * 
	 * @return el email
	 */
	public String getEmail() {
		return email;
	}

	/**
	 * Metodo para agregar un valor al email
	 * 
	 * @param email
	 */
	public void setEmail(String email) {
		this.email = email;
	}

	/**
	 * Metodo para obtener el valor de password del usuario.
	 * 
	 * @return password
	 */
	public String getPassword() {
		return password;
	}

	/**
	 * Metodo para agregar un valor
	 * 
	 * @param password
	 */
	public void setPassword(String password) {
		this.password = password;
	}

	/**
	 * Metodo para obtener el valor de la fecha de nacimiento del usuario.
	 * 
	 * @return fecha de nacimiento
	 */
	public Date getFechaNacimiento() {
		return fechaNacimiento;
	}

	/**
	 * Metodo para agregar un valor a la fecha de nacimiento.
	 * 
	 * @param fechaNacimiento
	 */
	public void setFechaNacimiento(Date fechaNacimiento) {
		this.fechaNacimiento = fechaNacimiento;
	}

	/**
	 * Metodo para obtener la foto del usuario.
	 * 
	 * @return el avatar del usuario
	 */
	public byte[] getAvatar() {
		return avatar;
	}

	/**
	 * Metodo para agregar un valor a el atributo de la imagen.
	 * 
	 * @param avatar
	 */
	public void setAvatar(byte[] avatar) {
		this.avatar = avatar;
	}

	/**
	 * Metodo para obtener el valor del numero de la ciudad
	 * 
	 * @return el numero de la ciudad
	 */
	public Integer getNumeroCiudad() {
		return numeroCiudad;
	}

	/**
	 * Metodo para agregar un valor determinado al numero de la ciudad.
	 * 
	 * @param numeroCiudad
	 */
	public void setNumeroCiudad(Integer numeroCiudad) {
		this.numeroCiudad = numeroCiudad;
	}

	/**
	 * Metodo para obtener el valor del DaoUsuario
	 * 
	 * @return DaoUsuario.
	 */
	public DaoUsuario getEjbUsuario() {
		return ejbUsuario;
	}

	/**
	 * Metodo para agregar un valor al Daousuario
	 * 
	 * @param ejbUsuario
	 */
	public void setEjbUsuario(DaoUsuario ejbUsuario) {
		this.ejbUsuario = ejbUsuario;
	}

	/**
	 * Metodo para obtener el valor del usuario en sesion.
	 * 
	 * @return usuario
	 */
	public Usuario getUsuario() {
		return usuario;
	}

	/**
	 * Metodo para agregar un valor a el usuario.
	 * 
	 * @param usuario
	 */
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	/**
	 * Metodo para obtener el valor del DaoCiudad.
	 * 
	 * @return daoCiudad.
	 */
	public DaoCiudad getEjbCiudad() {
		return ejbCiudad;
	}

	/**
	 * Metodo para agregar un valor al DaoCiudad.
	 * 
	 * @param ejbCiudad
	 */
	public void setEjbCiudad(DaoCiudad ejbCiudad) {
		this.ejbCiudad = ejbCiudad;
	}

	/**
	 * Metodo para obtener el valor del DaoRango.
	 * 
	 * @return DaoRango
	 */
	public DaoRango getEjbRango() {
		return ejbRango;
	}

	/**
	 * Metodo para agregar un valor al DaoRango.
	 * 
	 * @param ejbRango
	 */
	public void setEjbRango(DaoRango ejbRango) {
		this.ejbRango = ejbRango;
	}

	/**
	 * Metodo para obtener el nombre del sexo del usuario desde la pagina.
	 * 
	 * @return el nombre del sexo
	 */
	public String getNumeroSexo() {
		return numeroSexo;
	}

	/**
	 * Metodo para dar un valor al nombre del sexo.
	 * 
	 * @param numeroSexo
	 */
	public void setNumeroSexo(String numeroSexo) {
		this.numeroSexo = numeroSexo;
	}

}
